package web.safety.action;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.convention.annotation.ResultPath;
import domain.entities.*;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;
import org.springframework.beans.factory.annotation.Autowired;
import services.*;

import java.util.*;


@ResultPath("/")
public class PopupsController extends ActionSupport {

    private SafetydocsService safetyService;
    private DrogaService drogaService;
    private CompromisoPaisService paisService;
    private RoleCRUDService rolService;
    private MiembroBmsProtocoloService miembroBmsProtocoloService;
    private InvestigadorProtocoloCentroService investigProtCentroService;

    private String idVer;
    private Safetydocs safetydocs;
    private String drogaBuscar;
    private String paisesBuscar;
    private String rolesBuscar;
    private List<MiembroBms> miembrosBms = new ArrayList<MiembroBms>();
    private List<Involucrado> involucrados = new ArrayList<Involucrado>();

    @Autowired
    public PopupsController(SafetydocsService safetyService, DrogaService drogaService, CompromisoPaisService paisService, RoleCRUDService rolService, MiembroBmsProtocoloService miembroBmsProtocoloService, InvestigadorProtocoloCentroService investigProtCentroService) {
        this.safetyService = safetyService;
        this.drogaService = drogaService;
        this.paisService = paisService;
        this.rolService = rolService;
        this.miembroBmsProtocoloService = miembroBmsProtocoloService;
        this.investigProtCentroService = investigProtCentroService;
    }

    @Action(value="main", results={
            @Result(name="success", location="/safety.document.create.tiles", type="tiles")
    })
    public String execute() {
        return SUCCESS;
    }

    @Action(value="findMails", results={
            @Result(name="success", location="WEB-INF/jsp/Safety/document/ShowMails.jsp")
    })
    public String findMails() {

        Droga droga = drogaService.findById(Integer.parseInt(drogaBuscar));
        String [] paisesStr = paisesBuscar.split(",");
        List<Compromisopais> paises = new ArrayList<Compromisopais>();
        for(int i = 0; i < paisesStr.length; i++)
            paises.add(paisService.findById(Integer.parseInt(paisesStr[i])));

        String [] rolesStr = rolesBuscar.split(",");
        List<Role> rolesBms= new ArrayList<Role>();
        List<Role> rolesSite= new ArrayList<Role>();
        for(int i = 0; i < rolesStr.length; i++){
            Role rol = rolService.getRoleById(Integer.parseInt(rolesStr[i]));
            if(rol == null){
                Integer id = Integer.parseInt(rolesStr[i]);
                if(id.equals(Role.ID_PRINCIPAL_INVESTIGATOR)){
                    rolesSite.add(new Role(Role.ID_PRINCIPAL_INVESTIGATOR, Role.PRINCIPAL_INVESTIGATOR));
                }
                else if(id.equals(Role.ID_SUB_INVESTIGATOR)){
                    rolesSite.add(new Role(Role.ID_SUB_INVESTIGATOR, Role.SUB_INVESTIGATOR));
                }
            }
            else{
                if(rol.getBmsstaff())
                    rolesBms.add(rol);
                if(rol.getSiteStaff())
                    rolesSite.add(rol);
            }

        }

        List<MiembroBmsProtocolo> miembrosBmsProt = null;

        if(!rolesBms.isEmpty())
            miembrosBmsProt = miembroBmsProtocoloService.findByRolesProtocolosCompromisopaises(rolesBms, paises, droga.getProtocolos());
        if(!rolesSite.isEmpty()) {
            Set<Involucrado> involucradosSet = investigProtCentroService.findByRolesProtocolosCompromisopaises(rolesSite, paises, droga.getProtocolos());
            involucrados.addAll(involucradosSet);
        }

        if(miembrosBmsProt != null)  {
            Iterator<MiembroBmsProtocolo> itm = miembrosBmsProt.iterator();
            while(itm.hasNext()){
                miembrosBms.add(itm.next().getMiembroBms());
            }
        }

        Map session = ActionContext.getContext().getSession();
        session.put("miembrosBms", miembrosBms);
        session.put("involucrados", involucrados);

        return SUCCESS;
    }

    @Action(value="verSafety", results={
            @Result(name="success", location="WEB-INF/jsp/Safety/tracking/ShowSafety.jsp")
    })
    public String verSafety() {
        if(idVer != null){
            safetydocs = safetyService.findById(Integer.parseInt(idVer));
        }
        return SUCCESS;
    }

    public Safetydocs getSafetydocs() {
        return safetydocs;
    }

    public void setSafetydocs(Safetydocs safetydocs) {
        this.safetydocs = safetydocs;
    }

    public String getIdVer() {
        return idVer;
    }

    public void setIdVer(String idVer) {
        this.idVer = idVer;
    }

    public List<Involucrado> getInvolucrados() {
        return involucrados;
    }

    public void setInvolucrados(List<Involucrado> involucrados) {
        this.involucrados = involucrados;
    }

    public String getDrogaBuscar() {
        return drogaBuscar;
    }

    public void setDrogaBuscar(String drogaBuscar) {
        this.drogaBuscar = drogaBuscar;
    }

    public String getPaisesBuscar() {
        return paisesBuscar;
    }

    public void setPaisesBuscar(String paisesBuscar) {
        this.paisesBuscar = paisesBuscar;
    }

    public String getRolesBuscar() {
        return rolesBuscar;
    }

    public void setRolesBuscar(String rolesBuscar) {
        this.rolesBuscar = rolesBuscar;
    }

    public List<MiembroBms> getMiembrosBms() {
        return miembrosBms;
    }

    public void setMiembrosBms(List<MiembroBms> miembrosBms) {
        this.miembrosBms = miembrosBms;
    }
}